查看原文
其他

【小白课程】openKylin护眼模式功能和实现原理介绍

小K openKylin
2024-08-23
开源聚力,共创未来点击蓝字,关注openKylin~

1. 背景介绍

科学研究揭示,在白天,蓝光可以增强我们的注意力、反应力和情绪,并对自然的睡眠规律起重要作用。然而,在晚上,蓝光中的高能量具有较强的穿透能力,能直接触及视网膜。若长期置身于高强度蓝光的照射下,视网膜细胞可能会受到损伤,同时,它还可能干扰人体内部的生物钟,导致睡眠质量的下降。

在openKylin开源操作系统中,贴心地为用户提供了护眼模式,旨在通过调整屏幕色温与亮度,降低对用户视力的潜在危害。同时,它允许用户根据个人偏好和周围环境的需求,灵活调整屏幕显示效果,有效屏蔽高能蓝光,从而减轻视觉疲劳,提升用眼舒适度。


2.如何启动并设置护眼模式

2.1设置色温

我们可以通过多种途径快速打开控制面板,如按下win+i键、在桌面上右键并选择“显示设置”等。在控制面板的显示设置界面中,我们可以找到护眼模式选项。护眼模式可以减少屏幕的蓝光辐射,以降低对眼睛的刺激。

相较于单纯的开启色温,全天生硬的使用一个色温值,护眼模式则更加智能、更加贴心。在openKylin 2.0的护眼模式中,我们根据人的作息习惯引入了时间段的概念,并针对每个时间段提供不同的色温值,达到略微减少蓝光,中等减少蓝光,大量减少蓝光。三个时间段分别为:

  • 白天:日出之后~日落之前

  • 伴晚:日落之后1点之前

  • 深夜:1点到3点

  • 黎明:3点之后日出之前

每个时间段对应的色温值分别为:

  • 白天:4500k

  • 伴晚:3500k

  • 深夜:2800k

  • 黎明:3500k

同时,由于用户在使用电脑的时候系统主动调整屏幕的显示内容,是一件不符合用户使用习惯的事情。因此,为达到“悄悄的、不知不觉的、让用户无感的”效果。openKylin系统使用Linux社区的通用做法,使用一个小时的时间来进行色温过度,每分钟过度六十分之一。例如:
  • 白天:日落前一个小时开始向伴晚的色温渐变
  • 伴晚:12点开始向深夜的色温渐变
  • 深夜:2点开始向黎明的色温渐变
  • 黎明:日出前一个小时向白天的色温渐变

通过这种渐变的方式,openKylin系统可以实现在用户不知不觉中逐渐调整显示器的色温,避免突然的变化对用户造成不适。这种方法能够提供更加舒适的使用体验。

当然了,以上数据仅仅代表社区调研、分析的结论。三个档位的值并非是一个死值,他是以Gsettings存储的、可供用户自定义调整的。我们可以通过如下方法设置自己自定义的白天、黑夜,让“白天也懂夜的黑”

查询:

白天:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value伴晚:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn深夜:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-late-night黎明:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn

设置:

白天:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value 4500伴晚:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn 3500 深夜:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-late-night 2800黎明:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn 3500

当然如果设置错误,想要回复可以使用如下命令恢复为预设值:

gsettings reset-recursively org.ukui.SettingsDaemon.plugins.color

2.2实现原理

目前openKylin系统采用的方案是通过调整显示器的gamma曲线来实现调整色温的效果。根据redshift的色温与RGB的对照表,将色温以100K为刻度进行拆分,每个刻度对应一组RGB的值。举个例子:

{ { 1.0000, 0.0425, 0.0000 }, /* 1000K */ { 1.0000, 0.0668, 0.0000 }, /* 1100K */ { 1.0000, 0.0911, 0.0000 }, /* 1200K */ { 1.0000, 0.1149, 0.0000 }, /* ... */ /* ... */ { 1.0000, 0.2630, 0.0062 },/* 2000K */ { 1.0000, 0.4859, 0.1505 },/* 3000K */ { 1.0000, 0.6727, 0.3739 },/* 4000K */ { 1.0000, 0.8250, 0.6272 },/* 5000K */ { 1.0000, 0.9478, 0.8795 },/* 6000K */ { 1.0000, 1.0000, 1.0000 }, /* 6500K */ { 0.5944, 0.7414, 1.0000 } /* 10000K */};(https://gitee.com/openkylin/ukui-settings-daemon/blob/upstream/plugins/gamma-manager/rgb-gamma-table.h)

当需要调整色温,将色温换算出一组rgb,然后根据rgb调整gamma曲线即可,此方案不仅可以调整显示的色温,同时还可以调整显示器的亮度。核心代码:

for(int k = 0; k < m_pScreenRes->noutput; k++) {RROutput outputId = m_pScreenRes->outputs[k];XRROutputInfo *outputInfo = XRRGetOutputInfo (QX11Info::display(), m_pScreenRes, outputId);QString outputname = QString::fromLatin1(outputInfo->name);if (outputInfo->connection != RR_Connected) {XRRFreeOutputInfo(outputInfo); continue; } if (!outputInfo->crtc) { ret = true; USD_LOG(LOG_ERR,"crtc size is 0.\n"); goto FREEOUTPUT; } size = XRRGetCrtcGammaSize(QX11Info::display(), outputInfo->crtc); if (!size) { ret = false; USD_LOG(LOG_ERR,"Gamma size is 0.\n"); goto FREEOUTPUT; }
/* * The gamma-correction lookup table managed through XRR[GS]etCrtcGamma * is 2^n in size, where 'n' is the number of significant bits in * the X Color. Because an X Color is 16 bits, size cannot be larger * than 2^16. */ if (size > 65536) { ret = false; USD_LOG(LOG_ERR,"Gamma correction table is impossibly large.\n"); goto FREEOUTPUT; }
pCrtcGamma = XRRAllocGamma(size); if (!pCrtcGamma) { USD_LOG(LOG_ERR,"Gamma allocation failed.\n"); continue; } m_colorRGB.R == m_colorRGB.R ? m_colorRGB.R : 1.0; m_colorRGB.G == m_colorRGB.G ? m_colorRGB.G : 1.0; m_colorRGB.B == m_colorRGB.B ? m_colorRGB.B : 1.0;
gammaRed = 1 / m_colorRGB.R; gammaGreen = 1 / m_colorRGB.G; gammaBlue = 1 / m_colorRGB.B;
for (int i = 0; i < size; i++) {\ uint value = (i * 0xffff) / (size - 1); pCrtcGamma->red[i] = value * m_colorRGB.R * brightness; pCrtcGamma->green[i]= value * m_colorRGB.G * brightness; pCrtcGamma->blue[i] = value * m_colorRGB.B * brightness; } XRRSetCrtcGamma(QX11Info::display(), outputInfo->crtc, pCrtcGamma); XSync(QX11Info::display(), NULL); XRRFreeGamma(pCrtcGamma);FREEOUTPUT: XRRFreeOutputInfo(outputInfo); }



3.总结

现在人们的生活中充满了各种光源,包括电脑、手机和照明设备等。不同的人对于光源的接受程度不同,有些人长时间接触光源而不会对视力产生影响,而有些人则相反。其实,色温只是决定光线特性的一个方面,流明也是需要考虑的重要因素。为了保护视力,除了选择合适的色温和流明,培养远眺的习惯和让眼部肌肉放松也是很重要的。

openKylin操作系统中的护眼模式是一项既实用又方便的功能,它通过科学合理地调整屏幕色彩,减轻长时间使用电脑对眼睛可能造成的负担。同时,用户还可以根据自己的日常作息和视觉感受进行个性化设置,从而更好地保护视力。

openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造开源操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。

社区理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、元心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心、飞腾、兆芯、龙芯中科、景美、京东科技、平头哥、申泰信息、海光等21家产业同仁和行业机构。


审核:openKylin往期推荐:





50万奖金!面向RISC-V架构的AI开发框架构建与优化大赛等你来战!

给开发者更好的选择!支持多种AI框架的openKylin 2.0 alpha版本来啦!

openKylin城市用户组招募啦,超多权益等你来!

openKylin社区2023年度贡献榜单公布!
继续滑动看下一个
openKylin
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存